<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>全局定义函数的特点</title>
</head>
<body>
    
</body>
<script>
    /*
        其实 ！！！ JS是不推荐我们直接使用函数的  因为始终是无法解决windos添加对象的这个机制
            所以JS实际上推荐我们将函数利用在像对象，类中使用的
                不仅是JS  其实很多语言也是一样的  他们都不推荐直接使用函数  也就是不推荐直接全局的定义函数
                    更推荐的是将函数和类封装在一起  配合着一起使用
    */

    function getname(){
        console.log('666')
    }
    getname()  // 666
    window.getname()  //666
    /*
        根据以上的例子我们会发现，自定义的函数默认会被压到window对象中
            这个其实是历史遗留问题，这样其实是有问题的
    */
    console.log(window.screenX) // 0
    function screenX(){
        console.log('change')
    }
    console.log(window.screenX) // ƒ screenX() console.log('change')} 
    /*
        由以上的例子，我们可以很清楚的指定全局定义函数的错误原因，因为JS会将全局定义的函数压到window对象中
            所以当函数名和window本身的属性名重复的时候 就会发生覆盖
    */

    var jim = function(){
        console.log('jim')
    }
    jim()   //jim
    window.jim()   //jim
    /*
        当我们使用var来接收变量的时候  JS还是会将函数压到window对象中
    */

    let xue = function(){
        console.log('xue')
    }
    xue()  //xue
    window.xue()  //报错  window中不含有xue
    /*
        所以 我们可见 当使用ES6的语法推出let的变量声明的时候，  JS是不会将这个函数给压到window中的  
    */
</script>
</html>